package com.le.beans;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.List;

// 绘制场景、障碍物
public class MyFrame extends JFrame implements KeyListener, Runnable {
    // 定义一个集合，用于存放所有关卡场景（包括背景、障碍物）
    private List<BackGround> backGrounds = new ArrayList<>();

    // 定义一个变量，存放当前场景
    private BackGround bg = new BackGround();

    // 定义一个变量，记录当前马里奥
    private Mario mario;

    @Override
    // 重写paint()的方法，实现场景、物体的绘制
    public void paint(Graphics g) {
        // 创建一张背景图片，规定长宽
        Image image = createImage(1045, 500);
        // 开始设置图片
        Graphics graphics = image.getGraphics();
        graphics.drawImage(bg.getBg(), 0, 0, 1045,500, this);

        // 障碍物绘制出来
        for (Obstacle obstacle : bg.getObstacles()) {
            graphics.drawImage(obstacle.getObstacleImage(), obstacle.getX(), obstacle.getY(), this);
        }

        // 绘制马里奥
        graphics.drawImage(mario.getMarioImage(), mario.getX(), mario.getY(), this);

        // 描述到当前窗口中
        g.drawImage(image, 0, 0, this);
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == 37){ // 左移动
            mario.runLeft();
        } else if (e.getKeyCode() == 39){ // 右移动
            mario.runRight();
        } else if (e.getKeyCode() == 38){ // 跳跃
            mario.jump();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode() == 37){ // 左移动
            mario.runLeftStop();
        } else if (e.getKeyCode() == 39){ // 右移动
            mario.runRightStop();
        }
    }

    @Override
    public void run() {
        // 无限绘制马里奥
        while(true){
            // 绘制
            repaint();
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            // 判断马里奥是否通关
            if (mario.getX() > 1040){
                // 关卡通过
                // 获取当前关卡
                int level = bg.getLevel();
                // 重新设置背景
                bg = backGrounds.get(level);
                // 重新设置马里奥
                mario.setBg(bg);
                mario.setX(50);
                mario.setY(420);
            }
        }
    }

    public List<BackGround> getBackGrounds() {
        return backGrounds;
    }

    public void setBackGrounds(List<BackGround> backGrounds) {
        this.backGrounds = backGrounds;
    }

    public BackGround getBg() {
        return bg;
    }

    public void setBg(BackGround bg) {
        this.bg = bg;
    }

    public Mario getMario() {
        return mario;
    }

    public void setMario(Mario mario) {
        this.mario = mario;
    }
}
